#include "registerwidget.h"
#include "ui_registerwidget.h"
#include "logmanager.h"
#include <QCryptographicHash>
#include <QMessageBox>
#include <QSqlQuery>
#include <QDebug>
#include <QRegularExpression>
#include <QRegularExpressionValidator>
#include <QSqlError>

RegisterWidget::RegisterWidget(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::RegisterWidget)
{
    ui->setupUi(this);

    // 设置窗口标题
    setWindowTitle("用户注册");

    // 设置密码框为密码模式
    ui->passwordEdit->setEchoMode(QLineEdit::Password);
    ui->confirmPasswordEdit->setEchoMode(QLineEdit::Password);

    // 设置输入验证
    setupValidators();

    // 记录系统日志
    LogManager::logSystem("注册模块", "注册对话框打开");
}

RegisterWidget::~RegisterWidget()
{
    // 记录系统日志
    LogManager::logSystem("注册模块", "注册对话框关闭");
    delete ui;
}

void RegisterWidget::setupValidators()
{
    // 用户名
    QRegularExpression usernameRegex("^[a-zA-Z0-9_]{3,20}$");
    ui->usernameEdit->setValidator(new QRegularExpressionValidator(usernameRegex, this));

    // 邮箱
    QRegularExpression emailRegex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
    ui->emailEdit->setValidator(new QRegularExpressionValidator(emailRegex, this));

    // 手机号
    QRegularExpression phoneRegex("^1[3-9]\\d{9}$");
    ui->phoneEdit->setValidator(new QRegularExpressionValidator(phoneRegex, this));
}

QString RegisterWidget::hashPassword(const QString &password)
{
    QByteArray hash = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha256);
    return QString(hash.toHex());
}

bool RegisterWidget::validateInput()
{
    QString username = ui->usernameEdit->text().trimmed();
    QString password = ui->passwordEdit->text();
    QString confirmPassword = ui->confirmPasswordEdit->text();
    QString email = ui->emailEdit->text().trimmed();
    QString phone = ui->phoneEdit->text().trimmed();
    QString nickname = ui->nicknameEdit->text().trimmed();

    // 检查必填字段
    if (username.isEmpty() || password.isEmpty() || confirmPassword.isEmpty() ||
        email.isEmpty() || phone.isEmpty() || nickname.isEmpty()) {
        QMessageBox::warning(this, "输入错误", "所有字段都必须填写！");

        // 记录错误日志
        LogManager::logError("注册验证失败: 存在空字段");
        return false;
    }

    // 检查用户名格式
    if (!ui->usernameEdit->hasAcceptableInput()) {
        QMessageBox::warning(this, "用户名错误", "用户名必须是3-20位的字母、数字或下划线！");

        // 记录错误日志
        LogManager::logError(QString("注册验证失败: 用户名格式错误 - %1").arg(username));
        return false;
    }

    // 检查密码长度
    if (password.length() < 6) {
        QMessageBox::warning(this, "密码错误", "密码长度不能少于6位！");

        // 记录错误日志
        LogManager::logError("注册验证失败: 密码长度不足");
        return false;
    }

    // 检查密码一致性
    if (password != confirmPassword) {
        QMessageBox::warning(this, "密码错误", "两次输入的密码不一致！");

        // 记录错误日志
        LogManager::logError("注册验证失败: 两次密码不一致");
        return false;
    }

    // 检查邮箱格式
    if (!ui->emailEdit->hasAcceptableInput()) {
        QMessageBox::warning(this, "邮箱错误", "请输入有效的邮箱地址！");

        // 记录错误日志
        LogManager::logError(QString("注册验证失败: 邮箱格式错误 - %1").arg(email));
        return false;
    }

    // 检查手机号格式
    if (!ui->phoneEdit->hasAcceptableInput()) {
        QMessageBox::warning(this, "手机号错误", "请输入有效的11位手机号！");

        // 记录错误日志
        LogManager::logError(QString("注册验证失败: 手机号格式错误 - %1").arg(phone));
        return false;
    }

    return true;
}

bool RegisterWidget::checkUsernameExists(const QString &username)
{
    QSqlQuery query;
    query.prepare("SELECT COUNT(*) FROM users WHERE username = ?");
    query.addBindValue(username);

    if (query.exec() && query.next()) {
        return query.value(0).toInt() > 0;
    }

    // 记录错误日志
    LogManager::logError(QString("检查用户名失败: %1").arg(query.lastError().text()));
    return false;
}

bool RegisterWidget::checkEmailExists(const QString &email)
{
    QSqlQuery query;
    query.prepare("SELECT COUNT(*) FROM users WHERE email = ?");
    query.addBindValue(email);

    if (query.exec() && query.next()) {
        return query.value(0).toInt() > 0;
    }

    // 记录错误日志（查询失败）
    LogManager::logError(QString("检查邮箱失败: %1").arg(query.lastError().text()));
    return false;
}

void RegisterWidget::on_registerButton_clicked()
{
    QString username = ui->usernameEdit->text().trimmed();
    QString email = ui->emailEdit->text().trimmed();

    // 记录操作日志
    LogManager::logSystem("注册模块",
                         QString("注册尝试 - 用户名: %1, 邮箱: %2").arg(username).arg(email));

    if (!validateInput()) {
        return;
    }

    QString password = ui->passwordEdit->text();
    QString phone = ui->phoneEdit->text().trimmed();
    QString nickname = ui->nicknameEdit->text().trimmed();

    // 检查用户名是否已存在
    if (checkUsernameExists(username)) {
        QMessageBox::warning(this, "注册失败", "用户名已存在！");

        // 记录安全警告
        LogManager::logSystem("安全警告",
                             QString("尝试注册已存在的用户名 - %1").arg(username));
        return;
    }

    // 检查邮箱是否已存在
    if (checkEmailExists(email)) {
        QMessageBox::warning(this, "注册失败", "邮箱已被注册！");

        // 记录安全警告
        LogManager::logSystem("安全警告",
                             QString("尝试注册已存在的邮箱 - %1").arg(email));
        return;
    }

    // 对密码进行哈希加密
    QString hashedPassword = hashPassword(password);

    // 插入新用户到数据库
    QSqlQuery query;
    query.prepare("INSERT INTO users (username, password, email, phone, nickname, role, created_at) "
                  "VALUES (?, ?, ?, ?, ?, 'user', datetime('now'))");
    query.addBindValue(username);
    query.addBindValue(hashedPassword);
    query.addBindValue(email);
    query.addBindValue(phone);
    query.addBindValue(nickname);

    if (query.exec()) {
        QMessageBox::information(this, "注册成功", "用户注册成功！");

        // 记录成功的操作日志
        LogManager::logSystem("注册模块",
                             QString("用户注册成功 - 用户名: %1, 昵称: %2, 邮箱: %3, 手机: %4")
                             .arg(username).arg(nickname).arg(email).arg(phone));

        emit registerSuccess("用户注册成功");
        accept(); // 关闭对话框
    } else {
        QString error = query.lastError().text();
        QMessageBox::critical(this, "注册失败", "注册失败: " + error);

        // 记录错误日志
        LogManager::logError(QString("用户注册失败 - 用户名: %1, 错误: %2")
                           .arg(username).arg(error));

        emit registerFail("注册失败: " + error);
    }
}

void RegisterWidget::on_cancelButton_clicked()
{
    // 记录操作日志
    LogManager::logSystem("注册模块", "用户取消注册");

    reject(); // 关闭对话框
}
